package com.scalar.chiptrack.operations.dataentry.inventoryReceive.actioncommands;

import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.util.LabelValueBean;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.scalar.chiptrack.operations.process.dao.ProductDao;
import com.scalar.chiptrack.operations.process.dao.NewProductDAO;
import com.scalar.chiptrack.operations.dataentry.LotDetails;
import com.scalar.chiptrack.operations.dataentry.dao.DataEntryDAO;
import com.scalar.chiptrack.operations.dataentry.inventoryReceive.forms.InventoryReceiveForm;
import com.scalar.chiptrack.operations.vendor.dao.VendorDAO;
import com.scalar.chiptrack.operations.release.dao.RelaseDAO;

import com.scalar.chiptrack.users.User;
import com.scalar.chiptrack.users.Functionality;
import com.scalar.chiptrack.actioncommands.ActionCommand;
import com.scalar.chiptrack.commons.SessionKeys;
import com.scalar.chiptrack.utils.WorkWeek;

import java.util.HashMap;
import java.util.ArrayList;
import java.util.Date;
import java.util.Calendar;

/**
 * Created by IntelliJ IDEA.
 * User: ChandraSekhar
 * Date: Fed 06, 2008
 * Time: 12:28:08 PM
 */
public class InventoryReceiveLoadPartNumbersCommand extends ActionCommand
{

    private static final String ACTION_NAME = "/inventoryReceive.do" ;

    public ActionForward execute(ActionMapping mapping,
                                 ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws Exception
    {

        InventoryReceiveForm invReceiveForm = (InventoryReceiveForm) form;

        HashMap errors = new HashMap();
        HashMap info = new HashMap();
        String action = request.getParameter("action");
        String previousPsType   = null;
        String previouslocationType = null;
        String receivelocationType = null;
        LotDetails lotDetails = new LotDetails();
        request.setAttribute(INFO_MESSAGES, info);
        request.setAttribute(ERROR_MESSAGES, errors);

        HttpSession mSession = request.getSession();
        User user = (User) mSession.getAttribute(SessionKeys.USER_KEY);

        if (user == null)
        {
            mSession.setAttribute(SessionKeys.SOURCE_PAGE_KEY, ACTION_NAME);
            return (mapping.findForward("login"));
        }
        else
        {
            if (user.isActionAllowed(Functionality.DATA_ENTRY, User.USER_ACTION_MODIFY))
            {
                request.setAttribute("showMessage", "FALSE");
            }
            else
            {
                request.setAttribute("showMessage", "TRUE");
            }
        }

        ArrayList transitLotList;
        ArrayList dateCodeList = new ArrayList();
        int processStepId  = -1;

       try
       {
           int currentwk1; int currentwk2; int currentwk3;
           String yearAsDigit1; String yearAsDigit2; String yearAsDigit3;
            WorkWeek wk = WorkWeek.getCurrentWorkWeekInstance();
            currentwk1 = wk.getCurrentWWNumber();
            yearAsDigit1  = (wk.getWorkWeekYear()+"").substring(2);
            if ( currentwk1 == 1 )
            {
                Date dt =  wk.getCurrentWWStartDate();
                Calendar previousWkDate = Calendar.getInstance();
                previousWkDate.setTime( dt );
                previousWkDate.add( Calendar.DATE, -3 );
                WorkWeek prevWk = WorkWeek.getWorkWeekInstance( previousWkDate.getTime() );
                currentwk2 = prevWk.getCurrentWWNumber();
                currentwk3 = currentwk2 -1;
                yearAsDigit2  = (prevWk.getWorkWeekYear()+"").substring(2);
                yearAsDigit3 = yearAsDigit2;
            }
            else if ( currentwk1 == 2 )
            {
                currentwk2 = currentwk1 -1;
                yearAsDigit2  = yearAsDigit1;

                Date dt =  wk.getCurrentWWStartDate();
                Calendar previousWkDate = Calendar.getInstance();
                previousWkDate.setTime( dt );
                previousWkDate.add( Calendar.DATE, -10 );
                WorkWeek prevWk = WorkWeek.getWorkWeekInstance( previousWkDate.getTime() );
                currentwk3 = prevWk.getCurrentWWNumber();
                yearAsDigit3  = (prevWk.getWorkWeekYear()+"").substring(2);
                
            }
            else
            {
                currentwk2 = currentwk1 -1;
                currentwk3 = currentwk1 -2;
                yearAsDigit2  = yearAsDigit1;
                yearAsDigit3 = yearAsDigit1;
            }

            dateCodeList.add( new LabelValueBean(yearAsDigit3 + (currentwk3<10?"0"+currentwk3 : ""+currentwk3), yearAsDigit3 + (currentwk3<10?"0"+currentwk3 : ""+currentwk3) ) );
            dateCodeList.add( new LabelValueBean(yearAsDigit2 + (currentwk2<10?"0"+currentwk2 : ""+currentwk2), yearAsDigit2 + (currentwk2<10?"0"+currentwk2 : ""+currentwk2) ) );
            dateCodeList.add( new LabelValueBean(yearAsDigit1 + (currentwk1<10?"0"+currentwk1 : ""+currentwk1), yearAsDigit1 + (currentwk1<10?"0"+currentwk1 : ""+currentwk1) ) );

            dateCodeList.add( new LabelValueBean("--other--", "0") );

            if ( LOCATION_TYPE_ASSEMBLY.equalsIgnoreCase( invReceiveForm.getProcessType() ) )
            {
                 previousPsType = LOCATION_TYPE_DIE_BANK;
                 previouslocationType = previousPsType;
                 receivelocationType = LOCATION_TYPE_ASSEMBLY;
            }
            else if ( LOCATION_TYPE_FT.equalsIgnoreCase( invReceiveForm.getProcessType() ) )
            {
                previousPsType = LOCATION_TYPE_ASSEMBLY;
                previouslocationType = previousPsType;
                receivelocationType = LOCATION_TYPE_TEST;
            }
           /* else if ( LOCATION_TYPE_FPO.equalsIgnoreCase(invReceiveForm.getProcessType()) )
            {
                previousPsType = LOCATION_TYPE_FT;
                locationType = LOCATION_TYPE_TEST;
            }*/
            else if ( LOCATION_TYPE_TAPE_AND_REEL.equalsIgnoreCase(invReceiveForm.getProcessType()) )
            {
                previousPsType = LOCATION_TYPE_FT;
                previouslocationType = LOCATION_TYPE_TEST;
                receivelocationType = LOCATION_TYPE_CLASS_STORE;
            }
            else if ( LOCATION_TYPE_FG.equalsIgnoreCase(invReceiveForm.getProcessType()) )
            {
                 previousPsType = LOCATION_TYPE_TAPE_AND_REEL;
                 previouslocationType = LOCATION_TYPE_CLASS_STORE;
                 receivelocationType = LOCATION_TYPE_FINISHED_GOODS;
            }

            if ( invReceiveForm.getProcessStepId() > 0)
            {
                processStepId = NewProductDAO.getForwardOrBackwardProcessstepId( null,invReceiveForm.getProcessStepId(), 0, previousPsType );
            }
            else
            {
                  processStepId  = 0;
            }

            transitLotList = DataEntryDAO.loadAllTransitLots( previousPsType, processStepId+"", invReceiveForm.getLocationId() , invReceiveForm.getProcessType(), user.getVendorId(),invReceiveForm.getLotId() );

            if ( transitLotList == null || transitLotList.size() == 0 )
            {
                info.put("No "+previousPsType+" Transit lots available" , null );
            }

           invReceiveForm.setTransitLotsList( transitLotList );

           request.setAttribute("nextLocations", RelaseDAO.loadProcessVendors( receivelocationType ) );
           request.setAttribute("lotsList", DataEntryDAO.loadAllTransitLots( previousPsType, "0", 0 , invReceiveForm.getProcessType(), user.getVendorId(), 0 ) );
           request.setAttribute("processTypeList", lotDetails.getInventoryReceiveProcessList() );
           request.setAttribute("partNumbersList", ProductDao.loadAllPartsForProcessTypeByPsType( invReceiveForm.getProcessType() ) );
           request.setAttribute("locationList",    VendorDAO.getInventoryLocationsByProcessByUserType( null, previouslocationType, 0 ) );
           request.setAttribute("reciveProcessList", lotDetails.getReceiveProcessList() );
           request.setAttribute("dateCodeList", dateCodeList );

           request.setAttribute("action", action);
       }
       catch( Exception e)
       {
          request.setAttribute("processTypeList", lotDetails.getInventoryReceiveProcessList() );
          errors.put( "Unable to get Inventory Transit Lots", null); 
          e.printStackTrace();
       }
       return mapping.findForward( "inventoryReceive" );
    }
}
